package user

import (
	"github.com/gin-gonic/gin"
	models "HeadLineNews/proto_models/app/account_model"
	"HeadLineNews/resp"
)

type Server interface {
	UserRegisterHandler(c *gin.Context)
	UserLoginHandler(c *gin.Context)
}

type server struct {
	ctx   Ctx
	repo  Repo
	cache Cache
}

func NewServer() Server {
	return &server{
		ctx:   NewCtx(),
		repo:  NewRepo(),
		cache: NewCache(),
	}
}

// UserRegisterHandler 用户注册
func (s *server) UserRegisterHandler(c *gin.Context) {
	// 解析参数
	p, err := s.ctx.ParseParamUserRegister(c)
	if err != nil {
		return
	}
	// 检查唯一用户名
	if err = s.repo.CheckUniqueUserName(c, p.UserName); err != nil {
		return
	}
	var userId, token string
	if userId, token, err = s.repo.InsertUser(c, p); err != nil {
		return
	}
	// 返回响应
	resp.Success(c, &models.ResponseUserLoginRegister{
		UserId:        userId,
		UserName:      p.UserName,
		Authorization: token,
	})
}

// UserLoginHandler 用户登录
func (s *server) UserLoginHandler(c *gin.Context) {
	// 解析参数
	p, err := s.ctx.ParseParamUserLogin(c)
	if err != nil {
		return
	}
	// 检查登录数据
	if p, err = s.repo.CheckLoginData(c, p); err != nil {
		return
	}
	// 签发 token
	var token string
	if token, err = s.cache.RegUserLoginToken(c, p.UserId); err != nil {
		return
	}
	resp.Success(c, &models.ResponseUserLoginRegister{
		UserId:        p.UserId,
		UserName:      p.UserName,
		Authorization: token,
	})
}
